package com.skt.security;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

/**
 * Spring Security 认证主体封装类
 * 用于在 Authentication 中携带 userId 等关键信息
 */
public class LoginUser implements UserDetails {

    // 用户唯一业务 ID，用于后续业务逻辑（如创建订单、记录日志等）。
    private final Long userId;
    // 登录用户名（如手机号、邮箱等），Spring Security 要求必须提供。
    private final String username;
    // 注意：password 仅在登录时需要，认证成功后可设为 null（安全最 佳实践）
    private final String password;
    // 用户权限列表（如 ROLE_ADMIN），Spring Security 用于权限控制。
    private final Collection<? extends GrantedAuthority> authorities;
    // 控制用户是否启用（如被禁用、删除等）。
    private final boolean enabled; // 对应用户状态（如 status=1）

    // 1. 用于 UserDetailsService.loadUserByUsername（需要密码供 Spring Security 校验）
    public LoginUser(Long userId, String username, String password,
                     Collection<? extends GrantedAuthority> authorities, boolean enabled) {
        this.userId = userId;
        this.username = username;
        this.password = password; // 此时必须保留，用于密码比对
        this.authorities = authorities;
        this.enabled = enabled;
    }

    // 2. 用于认证成功后重新构建（清除密码）
    public LoginUser(Long userId, String username,
                     Collection<? extends GrantedAuthority> authorities, boolean enabled) {
        this.userId = userId;
        this.username = username;
        this.password = null; // ✅ 安全：认证成功后不保留密码
        this.authorities = authorities;
        this.enabled = enabled;
    }

    // ===== 核心方法：暴露 userId =====
    public Long getUserId() {
        return userId;
    }

    // ===== UserDetails 接口实现 =====
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password; // 登录后通常不使用，可考虑设为 null
    }

    @Override
    public String getUsername() {
        return username;
    }

    // 账户未过期（根据业务决定）
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    // 账户未锁定（由 enabled 控制）
    @Override
    public boolean isAccountNonLocked() {
        return enabled;
    }

    // 凭证未过期（如密码未过期）
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    // 用户是否启用（关键！用于状态校验）
    @Override
    public boolean isEnabled() {
        return enabled;
    }
}